/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.pnp.despachadores;

import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import pe.gob.pnp.actions.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author  Eduardo Cavero Guzmán
 * @date    03/04/2010
 *
 */
public class ExpedienteDespachador {

    public static void agregarExpediente(Expediente expediente) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_AGREGAR_EXPEDIENTE(?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, expediente.getNpepoIdentificador());
            cs.setString(2, expediente.getCexpeCodigoArchivo());
            cs.registerOutParameter(3, Types.INTEGER);
            cs.execute();
            int nexpeIdentificador = cs.getInt(3);
            expediente.setNexpeIdentificador(nexpeIdentificador);
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void buscarExpedientePorCodigoArchivo(Expediente expediente) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_EXPEDIENTE_CODAR(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, expediente.getCexpeCodigoArchivo());
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            if (rs.next()) {
                expediente.setNexpeIdentificador(rs.getInt("NEXPE_IDENTIFICADOR"));
                expediente.setNesexIdentificador(rs.getInt("NESEX_IDENTIFICADOR"));
                PersonalPolicial personal = new PersonalPolicial();
                personal.setCpersApepaterno(rs.getString("CPERS_APEPATERNO"));
                personal.setCpersApematerno(rs.getString("CPERS_APEMATERNO"));
                personal.setCpersNombre(rs.getString("CPERS_NOMBRE"));
                personal.setNgradIdentificador(rs.getInt("NGRAD_IDENTIFICADOR"));
                expediente.setPersonal(personal);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void incrementarCodigoArchivo(String codigoArchivo) throws SQLException {
        List<Correlativo> lstCorrelativos = new ArrayList<Correlativo>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_LISTA_CORRELATIVOS(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                Correlativo correlativo = new Correlativo();
                correlativo.setNtippIdentificador(rs.getInt("NTIPP_IDENTIFICADOR"));
                correlativo.setNcorrActual(rs.getInt("NCORR_INICIAL"));
                correlativo.setNcorrActual(rs.getInt("NCORR_ACTUAL"));
                lstCorrelativos.add(correlativo);
            }
            int codigo = Integer.parseInt(codigoArchivo);
            Correlativo aActualizar = null;
            for (Correlativo c : lstCorrelativos) {
                if (c.getNcorrActual() == codigo) {
                    aActualizar = c;
                    break;
                }
            }
            sql = "{call SP_INCREMENTAR_CORRELATIVO(?)}";
            cs = conn.prepareCall(sql);
            cs.setInt(1, aActualizar.getNtippIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static List<Expediente> obtenerExpedientes(String codigoArchivo, String nombre) throws SQLException {
        List<Expediente> lstExpedientes = new ArrayList<Expediente>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_EXPEDIENTES(?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.setString(2, codigoArchivo);
            cs.setString(3, nombre);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                Expediente expediente = new Expediente();
                expediente.setNexpeIdentificador(rs.getInt("NEXPE_IDENTIFICADOR"));
                expediente.setCexpeCodigoArchivo(rs.getString("CEXPE_CODIGOARCHIVO"));
                PersonalPolicial persona = new PersonalPolicial();
                persona.setCpersApepaterno(rs.getString("CPERS_APEPATERNO"));
                persona.setCpersApematerno(rs.getString("CPERS_APEMATERNO"));
                persona.setCpersNombre(rs.getString("CPERS_NOMBRE"));
                expediente.setPersonal(persona);
                lstExpedientes.add(expediente);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstExpedientes;
    }

    public static List<Expediente> buscarPorIndices(int ntidoIdentificador, List<String> valores) throws SQLException {
        List<Expediente> lstExpedientes = new ArrayList<Expediente>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "SELECT E.CEXPE_CODIGOARCHIVO, P.CPERS_APEPATERNO, P.CPERS_APEMATERNO, P.CPERS_NOMBRE";
            sql += " FROM SISMA_EXPEDIENTE E";
            sql += " INNER JOIN PERMA_PERSONALPOLICIAL PP";
            sql += " ON PP.NPEPO_IDENTIFICADOR=E.NPEPO_IDENTIFICADOR";
            sql += " INNER JOIN PERMA_PERSONA P";
            sql += " ON P.NPERS_IDENTIFICADOR=PP.NPERS_IDENTIFICADOR";
            sql += " WHERE E.NEXPE_IDENTIFICADOR IN";
            sql += " (SELECT DISTINCT E.NEXPE_IDENTIFICADOR";
            sql += " FROM DIGMA_INDEXADO N";
            sql += " INNER JOIN DIGMA_INDICE I";
            sql += " ON I.NINDI_IDENTIFICADOR=N.NINDI_IDENTIFICADOR";
            sql += " INNER JOIN DIGMA_DOCUMENTODIGITALIZADO DD";
            sql += " ON DD.NDODI_IDENTIFICADOR=N.NDODI_IDENTIFICADOR";
            sql += " INNER JOIN SISMA_EXPEDIENTE E";
            sql += " ON E.NEXPE_IDENTIFICADOR=DD.NEXPE_IDENTIFICADOR";
            sql += " WHERE I.NTIDO_IDENTIFICADOR=?";
            int i = 2;
            for (String valor : valores) {
                sql += " OR N.CINDE_VALOR LIKE ?";
                i++;
            }

            sql += ")";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, ntidoIdentificador);
            i = 2;
            for (String valor : valores) {
                ps.setString(i, valor);
                i++;
            }
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Expediente expediente = new Expediente();
                expediente.setCexpeCodigoArchivo(rs.getString("CEXPE_CODIGOARCHIVO"));
                PersonalPolicial persona = new PersonalPolicial();
                persona.setCpersApepaterno(rs.getString("CPERS_APEPATERNO"));
                persona.setCpersApematerno(rs.getString("CPERS_APEMATERNO"));
                persona.setCpersNombre(rs.getString("CPERS_NOMBRE"));
                expediente.setPersonal(persona);
                lstExpedientes.add(expediente);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstExpedientes;
    }

    public static List<FolioBean> obtenerDocumentosExpediente(ExpedienteBean expediente) throws SQLException {
        List<FolioBean> folios = new ArrayList<FolioBean>();
        Connection conn = null;
        String sql="";
        try {
            conn = ConnectionPool.obtenerConexion();
            sql = "SELECT F.NFOLI_IDENTIFICADOR,F.NFOLI_PAGINA, DD.CDODI_DESCRIPCION,";
            sql += " DD.NDODI_IDENTIFICADOR FROM DIGMA_FOLIO F ";
            sql += " INNER JOIN DIGMA_DOCUMENTODIGITALIZADO DD ";
            sql += " ON DD.NDODI_IDENTIFICADOR=F.NDODI_IDENTIFICADOR";
            sql += " WHERE DD.NEXPE_IDENTIFICADOR=?";
            sql += " AND F.BFOLI_ELIMINADO=0 ";
            sql += " AND DD.NTIDO_IDENTIFICADOR=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, expediente.getId());
            ps.setInt(2,expediente.getNtido_identificador());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                FolioBean folio = new FolioBean();
                DocumentoDigitalizadoBean documento = new DocumentoDigitalizadoBean();
                documento.setId(rs.getInt("NDODI_IDENTIFICADOR"));
                documento.setDescripcion(rs.getString("CDODI_DESCRIPCION"));
                folio.setDocumento(documento);
                folio.setId(rs.getInt("NFOLI_IDENTIFICADOR"));
                folio.setPagina(rs.getInt("NFOLI_PAGINA"));
                folios.add(folio);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return folios;
    }

    public static List<FolioBean> obtenerDocumentosExpedientePNP(ExpedienteBean expediente) throws SQLException {
        List<FolioBean> folios = new ArrayList<FolioBean>();
        Connection conn = null;
        String sql="";
        try {
            conn = ConnectionPool.obtenerConexion();
            sql = "SELECT  DD.CDODI_DESCRIPCION,DD.NDODI_IDENTIFICADOR, ";
            sql += " COUNT(F.NFOLI_PAGINA) AS NFOLI_PAGINA";
            sql += " FROM DIGMA_DOCUMENTODIGITALIZADO DD";
            sql += " INNER JOIN DIGMA_FOLIO F";
            sql += " ON DD.NDODI_IDENTIFICADOR=F.NDODI_IDENTIFICADOR";
            sql += " WHERE DD.NEXPE_IDENTIFICADOR=?";
            sql += " AND F.BFOLI_ELIMINADO=0 ";
            sql += " AND DD.NTIDO_IDENTIFICADOR=?";
            sql += " GROUP BY  DD.CDODI_DESCRIPCION,DD.NDODI_IDENTIFICADOR";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, expediente.getId());
            ps.setInt(2,expediente.getNtido_identificador());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                FolioBean folio = new FolioBean();
                DocumentoDigitalizadoBean documento = new DocumentoDigitalizadoBean();
                documento.setId(rs.getInt("NDODI_IDENTIFICADOR"));
                documento.setDescripcion(rs.getString("CDODI_DESCRIPCION"));
                folio.setDocumento(documento);
                folio.setPagina(rs.getInt("NFOLI_PAGINA"));
                folios.add(folio);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return folios;
    }
}
